Repository navigation
Combine pull requests 774, 764, 765, 773, 772 and 759 - #776
Conversation
A bounded drawing arena replaces its whole state with a deep copy on every create, delete and setter, whether or not a checkpoint shares it, so a script that moves a few of its live drawings per bar pays O(bound) per call and the first write after each checkpoint pays it again. The unbound arena already shares blocks of 32 records between copies and clones only the blocks a write reaches; this is the bounded twin of test_coof_drawing_checkpoint_cost. The test fills an arena to its bound (100 and 1,000), then runs the scheduler's checkpoint sequence (snapshot, restore, execute, commit) around an execution that deletes the oldest label, creates one, moves three and changes one text, all with texts that are never inline so a record copy allocates. Per execution it checks that the arena shares all but a few blocks of records with its checkpoint (the same record object through both) and that the heap blocks allocated do not depend on the bound, that the arena equals a plain model of the same operations after every execution, and that checkpointing an unwritten arena allocates the same at both bounds. The cost row is the row the change that follows must turn from red to green; the model row and the unchanged-checkpoint row are the guards that change has to keep green. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
A bounded arena replaced its whole state with a deep copy on every create, delete and setter: every slot, the text of every label, the directory and the order, whether or not a script-state checkpoint still shared it. A script that moves a few of its live drawings on every bar therefore paid time proportional to the bound on every call, and the first write after each checkpoint paid it again. The slots now live in a DrawingRecordStore, the block store the unbound arena already uses: blocks of 32 that a copy of the state shares, one path copied per write that reaches a shared block. A copy of the state shares the blocks and copies only the directory and the order (an integer per occupant), the directory with room for every slot so a creation never reallocates it. Creation, deletion and every setter give the arena a state of its own when a checkpoint shares it, then change it in place. Each does every step that can allocate or throw (the state's copy, the copy of the slot's block, the directory's room, the order's growth) before its first change and only steps that cannot throw after it, so a refused allocation leaves the arena and its checkpoint as they were. The search for the lowest free slot starts at a recorded index below which every slot is occupied, so slot reuse order is unchanged and a creation no longer scans every slot. The bound, the typed overflow outcome, the stale-handle behaviour and every value a script reads are unchanged. The source allocation-bound gate (ci/cr150-source-bounds.yaml) pins every growable-container site of include/pineforge/**, so its reviewed site inventory moves with this change: the two groups for the removed whole-state copies are deleted and the OPEN ceiling drops by two; the groups for the slots (a block store filled by push_back), the directory and the state's allocation gain the new site identities. The inventory is the gate's own proposal for this tree; its differences from the previous one are exactly those sites. The gate's real-tree test pins the number of OPEN groups, so that pin moves by the same two. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Main moved to the hosted verification jobs and their documentation since this branch was cut. No file of this change is touched by those commits and no conflict arises. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
… lines A bounded drawing arena's edits and checkpoints do no per-record work in the bound: they copy only the blocks of 32 records they write. They do not cost O(changes): the first write after a checkpoint still copies the slot directory and the creation order (one 8-byte integer per occupant), and deleting the oldest drawing moves the directory's entries. The test header and the CHANGELOG now say so, and the test's function is renamed to match. The source allocation-bound manifest keeps its line fields as diagnostics. The entries of drawing.hpp that the change moved (U1665, U1669, U1670, U1671, U1672) carry the first line the gate finds for them again. No identity changes. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The CHANGELOG entry and the cost test header of the bounded drawing change said that the first write after a checkpoint copies "one 8-byte integer per occupant". The slot directory holds two 32-bit integers per occupant (the id and the slot) and the creation order one 32-bit integer, so both now say "a directory entry and an order index per occupant". Words only: no code, no assertion and no manifest line changes. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Main moved by one commit since the previous merge: the hosted sanitizer builds get a dedicated data disk (two workflow files). No file of this change is touched by it and no conflict arises. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Assert open and closed short accessors preserve direction from a real fill.
Report signed quantities for open and closed short trades while preserving long, flat and bounds behavior.
The signed trade-size accessor fix intentionally removes two obsolete public statements from docs/pages/pine-to-native.md. The sentence introduced by 7328f4d is wrong after the fix because Pine's size accessor carries direction in its sign; the sentence introduced by cced2aa is the same obsolete unsigned/raw-quantity description. The replacement rows state positive long and negative short and distinguish raw magnitude fields with is_long. Name 7328f4d and cced2aa so the doc-reverts guard can verify why those historical sentences were removed.
The accessor bodies already return signed quantities; keep each expression on one source line so the existing documentation citations remain bound to the same header and implementation lines. This preserves the exact signed-size tree behavior while removing the anchor shift.
…n moved its lines The bounded drawing checkpoint test adds one source, test_drawing_bound_checkpoint_cost, to the TEST_SOURCES list near the top of tests/CMakeLists.txt, which moves every later line of that file by one. The evidence row for test_pooc_close_fill_view_tapes cites five of those lines: the line the sweep re-reads (3459, now 3460) and four in its reason text (:3443, :3455, :3479 and :3485-3501, now :3444, :3456, :3480 and :3486-3502). test_private_fixture_reads failed with "the token no longer sits on tests/CMakeLists.txt:3459", and test_private_fixture_reads_controls failed with it. Only those five numbers change; the row's text is otherwise as it was. Each new line was read from the file: 3444 is the EXISTS test of a tape, 3456 the increment of _pf_pcv_emitted, 3460 the condition that is the row's token, 3480 the registration of the test, 3486 the registration of the skipped placeholder. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Use GCC minimal debug information for instrumented Debug profiles while retaining file and line data, sanitizer flags and the full test selection. Keep the definition below the cited profile-floor table so existing documentation anchors remain valid. This is a measurement step: it lowers debug info only. The pass condition is at least 20 GB free after Verify on the worst hosted sanitizer shard. If that margin is not reached, each shard will build only its own targets next.
Update the margin-call twin assertion digest and register the pyramiding partial-drain signed-size rewrite in the twin parity inventory. Recompute the inventory hash so the guard covers both intentional assertion changes.
Build and select the existing ABI layout probe alongside the eleven existing fast executables. Update the derived membership pin, preserve prior checks, and exercise removal of the actual ABI row through the real workflow checker. Documentation replacement: the sentence "names its eleven real executables; configure refuses" now names twelve executables and explains the existing probe's Linux x86_64 GNU libstdc++ applicability.
The ABI smoke explanation adds two documentation lines. Correct both exact line-count expectations from 2060 to 2062 while retaining all substantive runner, slow-inventory and same-size negative checks.
Accept live_drawings through the existing typed limit helper and publish its English template, preserving the code identity, since value and prior limit values. Regenerate the registry and catalog diff and exercise distinct operator maxima through the real helper contract.
Bring the merged hosted release workflow and its CI documentation and checks into the candidate without rewriting the existing commits.
Bring the merged hosted release workflow and its CI documentation and checks into the candidate without rewriting the existing commits.
The merge gate now requires pineforge/parity and treats pineforge/verify as advisory, so the promotion workflow skipped every engine merge whose head carried no verify status. Admit on pineforge/parity success alone; a failed or absent parity still skips. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Retain the ABI smoke selector and its tests alongside the current engine changes.
Retain the runtime limit catalog addition alongside the current engine changes.
Require the complete parity-only head predicate while preserving main-copy, latest-status, pagination, tree, authorization and credential-order checks. Add Bash and jq status decisions and workflow mutation controls.
Normalize enclosing parentheses around the exact parity-success expression. Reject compound and malformed predicates, and cover parity-only, verify-only, combined-status and missing-status cases plus expression wrapping controls.
Point seven documentation citations at the matching catalog fields after the vocabulary additions shifted their lines.
Keep the live drawing vocabulary and documentation corrections with the current cohort admission behavior.
Main now holds the cohort admission change, the run option series_origin_ms and the other changes since the last merge. The four conflicts are mechanical: CHANGELOG.md keeps both new entries; the unreviewed ceiling of the allocation-bound manifest becomes 1404 (main's 1406 less the two groups this change removes) and the gate test's pin becomes 1356 + 48 + 184; the five line citations of the private fixture evidence row move down by the one line this change adds to tests/CMakeLists.txt, each checked against main's line by hash. The site inventory merged without a conflict and is checked by the gate itself. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Retain the runtime vocabulary change and the current input conversion documentation.
… accessors) Plain merge of the source head into the combined branch; nothing was resolved by hand. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…footprint) Plain merge of the source head into the combined branch; nothing was resolved by hand. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…moke) Plain merge of the source head into the combined branch; nothing was resolved by hand. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…on parity alone) Plain merge of the source head into the combined branch; nothing was resolved by hand. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…place and share their slots between checkpoints) Plain merge of the source head into the combined branch; nothing was resolved by hand. The source head is the pull request branch merged with main c6a61ef. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
There was a problem hiding this comment.
Graphify reviewed this change.
Worth a look — the grounded gate found no coupling regressions or blocking issues, but 1 advisory finding(s) below merit a look before merge.
Not checked: tests were not run; no formal proof of the changed code.
Graphify review — findings
Changes bounded drawing arenas (line, box, label) to write in place and keep their slots in shared blocks of 32, so a create, delete or setter copies only the blocks it writes instead of deep-copying the whole state. The first write after a checkpoint still copies the slot directory and creation order, and the bound, overflow outcome, slot reuse order and stale-handle behaviour stay the same; bound_edit now edits the state directly, which is where an edit that throws mid-write could leave it partly changed. Relaxes the baseline-promotion status gate so the engine axis admits on pineforge/parity alone, with pineforge/verify treated as advisory, and the skip notice now names only parity. A merge whose verify status is not success can now be promoted. Updates the CR150 source-bounds ledger and site inventory for the new block-shared slot storage, dropping the two whole-state copy groups and lowering the unreviewed ceiling from 1406 to 1404. Adds a changelog entry for the drawing change, along with new tests and CI preflight checks.
Worth a look
- Baseline promotion no longer requires the pineforge/verify status —
.github/workflows/promote-baseline.yml:375· Escalate · medium- NOT verified (no proof, no reproducing execution) — needs human review
Review partial — this diff was larger than one review pass covers, so later files were not reviewed; some findings may be missing.
Analysis details — impact, health, verification
Impact & health
Graphify review
Impact — 7075 functions depend on the 4115 functions this change touches.
Health — this change adds coupling hotspots:
- worse:
ci_workflow_findings()— 87 callers, 24 callees - new:
run()— 1 callers, 7 callees - new:
body()— 1 callers, 6 callees
Verification — 7075 functions in the blast radius were not formally verified this run (proofs are advisory here).
Gate & verification
graphify gate
PASS — objectively clean (no health regressions, tests not run — proofs not run this pass (advisory)). Grounded, not self-assessed.
Advisory (not blocking):
- verification_scope: 7021 function(s) in the blast radius were not formally verified this run
· 2 grounded finding(s) anchored inline below; 1 more finding(s) on lines outside this diff (see the check run).
| } | ||
|
|
||
| // ---- one script execution, on the arena and on its model --------------------- | ||
| void body(DrawingArena<LabelRec>& arena, int bar) { |
There was a problem hiding this comment.
body()
fans out to 6 callees (efferent coupling).
Grounded coupling-delta finding (deterministic), not an LLM guess.
| bool final_state_ok = false; | ||
| }; | ||
|
|
||
| Cost run(int bound, int executions) { |
There was a problem hiding this comment.
run()
fans out to 7 callees (efferent coupling).
Grounded coupling-delta finding (deterministic), not an LLM guess.
Summary
This branch combines six open pull requests into one change on top of main (
c6a61ef4), so that the build, the parity sweep and the review each run once. Every source head was merged with an ordinary merge commit: nothing was rebased, nothing was squashed inside the branch, no conflict occurred and nothing was resolved by hand. When this change merges, the six pull requests below are closed with a link to it.PR type: code (engine sources, tests, CI scripts and documentation).
Sources
99b0bfec50778ac90fd34b21249f15848c73815a834333f0174886a87eda01d4ca6175920d96563bbe68cabc6f3ff8c0171c008773ca0af28247c6d64f31c10ce425bbc48b5affce9843968685c6b154349418e59aa35b37c0b5b6d6979d9dbb548a9942cecedc0ef3cc7fc919ba840df0f66c23a4f74287The head listed for #759 is that pull request's branch merged once with main; the head published on #759 is older. Draft pull request #758 is not part of this change.
How it was built
The merges were made in this order: #774 (a fast-forward, its head already contains main), then #764, #765, #773, #772 and #759. Relative to main, 54 files change. Three files are touched by two sources and merged automatically without a conflict:
scripts/ci_preflight.pyandscripts/test_ci_preflight.py(#772 and #773), andtests/CMakeLists.txt(#759 and #773). The result does not depend on the order: merging the same heads in the reverse order gives the identical tree. No file changes that none of the six sources changes.What is still required before merge
CI green on this head, one parity sweep against the active baseline, one review of the combined diff that cites each source pull request, and the native live run. The results already recorded on the individual pull requests are not repeated here and do not stand in for these.
🤖 Generated with Claude Code